home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Delphi Magazine Collection 2001
/
Delphi Magazine Collection 20001 (2001).iso
/
DISKS
/
Issue35
/
etimer
/
ETIMER.ZIP
/
ETIMER.PAS
Wrap
Pascal/Delphi Source File
|
1998-06-09
|
5KB
|
156 lines
unit ETimer;
(*
Enhanced Timer V1.00 - released June 09, 1998
Copyright (c) 1998 by Demian
Disclaimer:
This component is distributed as Freeware. There is no charge or warranty
whatsoever. The author will not be held responsible for any direct or indirect
damage resulting from the use of the component or any derivatives thereof.
In short: USE IT AT YOUR OWN RISK! You are allowed to include the component
code in any commercial or non commercial product. You are also allowed to make
as many copies of the component as you want and distribute them, as long as you
do not receive any money for the copying/distribution.
You can send any comments, suggestions and bugs to demian@bhnet.com.br
New versions can be found at: http://www.bhnet.com.br/~demian
http://web.unix.horizontes.com.br/~demian
If you do any modification to this code, please send me a copy.
If you use this code on any 'real-life' application, please let me know.
If you think this code is completely useless, please DON'T LET ME KNOW!
What it does:
TTimer descendent with a new property, Snooze, that keeps a counter of
miliseconds elapsed since the last time the user moved/clicked the mouse or
pressed a key. Useful to implement timeout routines.
How to use it:
1. Install the component [VNM Pallete];
2. Drop one or more TETimer onto a form;
3. Use the component as you would use a regular TTimer. The only difference is
the new Snooze property, that can be consulted/edited at run-time. For example,
the following code (OnTimer event) emits a sound whenever the application stays
idle for more than one minute:
procedure TForm1.ETimer1Timer(Sender: TObject);
begin
with TETimer(Sender) do
if Snooze > 60000 then begin
MessageBeep(MB_OK);
Snooze := 0;
end;
end;
*)
interface
uses Classes,ExtCtrls;
type
TETimer = class(TTimer)
private
function GetSnooze: LongInt;
procedure SetSnooze(const Value: LongInt);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Snooze: LongInt read GetSnooze write SetSnooze;
end;
procedure Register;
implementation
uses {$IFDEF WIN32}Windows;{$ELSE}WinProcs,WinTypes;{$ENDIF}
var
Instances: integer;
ElapsedTime: LongInt;
whKeyboard,whMouse: HHook;
{______________________________________________________________________________}
procedure Register;
begin
RegisterComponents('VNM',[TETimer]);
end;
{______________________________________________________________________________}
{$IFDEF WIN32}
function MouseHookCallBack(Code: integer; Msg: WPARAM;
MouseHook: LPARAM): LRESULT; stdcall;
{$ELSE}
function MouseHookCallBack(Code: integer; Msg: word;
MouseHook: longint): longint; export;
{$ENDIF}
begin
if Code >= 0 then
ElapsedTime := GetTickCount;
Result := CallNextHookEx(whMouse,Code,Msg,MouseHook);
end;
{______________________________________________________________________________}
{$IFDEF WIN32}
function KeyboardHookCallBack(Code: integer; Msg: WPARAM;
KeyboardHook: LPARAM): LRESULT; stdcall;
{$ELSE}
function KeyboardHookCallBack(Code: integer; Msg: word;
KeyboardHook: longint): longint; export;
{$ENDIF}
begin
if Code >= 0 then
ElapsedTime := GetTickCount;
Result := CallNextHookEx(whKeyboard,Code,Msg,KeyboardHook);
end;
{______________________________________________________________________________}
constructor TETimer.Create(AOwner:TComponent);
function GetModuleHandleFromInstance: THandle;
var
s: array[0..512] of char;
begin
GetModuleFileName(hInstance,s,sizeof(s)-1);
Result := GetModuleHandle(s);
end;
begin
inherited Create(AOwner);
Inc(Instances);
if Instances = 1 then begin
ElapsedTime := GetTickCount;
whMouse := SetWindowsHookEx(WH_MOUSE,MouseHookCallBack,
GetModuleHandleFromInstance,
{$IFDEF WIN32}GetCurrentThreadID{$ELSE}
GetCurrentTask{$ENDIF});
whKeyboard := SetWindowsHookEx(WH_KEYBOARD,KeyboardHookCallBack,
GetModuleHandleFromInstance,
{$IFDEF WIN32}GetCurrentThreadID{$ELSE}
GetCurrentTask{$ENDIF});
end;
end;
{______________________________________________________________________________}
destructor TETimer.Destroy;
begin
Dec(Instances);
if Instances = 0 then begin
UnhookWindowsHookEx(whKeyboard);
UnhookWindowsHookEx(whMouse);
end;
inherited Destroy;
end;
{______________________________________________________________________________}
procedure TETimer.SetSnooze(const Value: LongInt);
begin
ElapsedTime := GetTickCount + Value;
end;
{______________________________________________________________________________}
function TETimer.GetSnooze: LongInt;
begin
result := GetTickCount - ElapsedTime;
end;
end.